import re
import tkinter.messagebox
import tkinter

# 创建主窗口
root = tkinter.Tk()
root.geometry('300x270+400+100')
root.resizable(False, False)
root.title("简易计算器 - 董付国")

# 用于显示计算内容的文本框
contentVar = tkinter.StringVar(root, "")
contentEntry = tkinter.Entry(root, textvariable=contentVar)
contentEntry['state'] = 'readonly'
contentEntry.place(x=10, y=10, width=280, height=20)

# 按钮点击事件处理函数
def buttonClick(btn):
    content = contentVar.get()
    if content.startswith('.'):
        content = '0' + content
    if btn in '0123456789':
        content += btn
    elif btn == '.':
        lastPart = re.split(r'[+\-*/]', content)[-1]
        if '.' in lastPart:
            tkinter.messagebox.showerror("错误", "小数点太多了")
            return
        else:
            content += btn
    elif btn == 'C':
        content = ""
    elif btn == '=':
        try:
            content = str(eval(content))
        except:
            tkinter.messagebox.showerror("错误", "表达式错误")
            return
    elif btn in operators:
        if content.endswith(operators):
            tkinter.messagebox.showerror("错误", "不允许存在连续运算符")
            return
        else:
            content += btn
    elif btn == 'Sqrt':
        n = content.split(':')
        if all(map(lambda x: x.isdigit(), n)):
            content = eval(content) ** 0.5
        else:
            tkinter.messagebox.showerror("错误", "表达式错误")
            return
    contentVar.set(content)

# 放置清除按钮和等号按钮
btnClear = tkinter.Button(root, text='Clear', command=lambda: buttonClick('C'))
btnClear.place(x=40, y=40, width=80, height=20)
btnCompute = tkinter.Button(root, text='=', command=lambda: buttonClick('='))
btnCompute.place(x=170, y=40, width=80, height=20)

# 放置数字和计算平方根按钮
digits = list('0123456789.') + ['Sqrt']
index = 0
for row in range(4):
    for col in range(3):
        d = digits[index]
        index += 1
        btnDigit = tkinter.Button(root, text=d, command=lambda x=d: buttonClick(x))
        btnDigit.place(x=20 + col * 70, y=80 + row * 50, width=50, height=20)

# 放置运算符按钮
operators = ('+', '-', '*', '/', '**', '//')
for index, operator in enumerate(operators):
    btnOperator = tkinter.Button(root, text=operator, command=lambda x=operator: buttonClick(x))
    btnOperator.place(x=230, y=80 + index * 30, width=50, height=20)

# 启动主循环
root.mainloop()